﻿using System;
using System.Collections;
using System.Linq;
using System.Linq.Dynamic;
using System.Web.Mvc;
using ChoViet.CMS.ViewModels;
using ChoViet.Lib.Common;
using ChoViet.Lib.Helpers;
using ChoViet.Lib.Paging;
using ChoViet.Model;
namespace ChoViet.CMS.Controllers
{
    public class TagController : BaseController
    {
        /// <summary>
        /// Created by: VietLv
        /// Created date: 29/06/2012
        /// Description: Manage tags
        /// </summary>

        ChoVietDataContext eDataContext = new ChoVietDataContext();
        #region Site
        [ChildActionOnly]
        public ActionResult GetKeyword( int boxtagsize)
        {
            try
            {
                TagboxViewModel taglist = new TagboxViewModel();
                taglist.Tags = eDataContext.Tags.OrderByDescending(e => e.Priority).Take(boxtagsize).ToList();
                return View(taglist);

            }
            catch (Exception exp)
            {
                eDataContext.Dispose();
                Messages.AddErrorMessage("Tổng hợp dữ liệu chưa đầy đủ");
                return View(new TagboxViewModel());
            }
        }
        #endregion

        #region CMS

        #region GET/IndexCMS
        [RoleHelper(Roles = RoleSystem.Tag)]
        public ActionResult IndexCms(int? page)
        {
            try
            {
                if (!page.HasValue) page = 1;
                string order = UserState.getUserStateFromRequest("Tag.order", "order", "ID").ToString();
                string orderDir = UserState.getUserStateFromRequest("Tag.orderDir", "orderDir", "desc").ToString();
                string keyword = UserState.getUserStateFromRequest("Tag.Keyword", "Keyword", "").ToString();
                int pageSize = int.Parse(UserState.getUserStateFromRequest("Tags.pageSize", "PageSize", 20).ToString());
                var listTags = eDataContext.Tags
                                .Where(t => (string.IsNullOrEmpty(keyword) ? true :
                                (t.Name.ToString().ToLower().Contains(keyword.ToLower().Trim())
                                )))
                                .OrderBy(string.Format("{0} {1}", order, orderDir))
                                .ToPagedList(page.Value - 1, pageSize);

                ViewData["orderDir"] = orderDir;
                ViewData["order"] = order;
                return View(new IndexTagViewModel
                {
                    Tags = listTags,
                    Keyword = keyword
                });
            }
            catch (Exception ex)
            {
                ViewData["MessageInfo"] = ex.Message;
                return View();
            }
        }
        #endregion

        #region POST: /Tag/CreateCms
        [RoleHelper(Roles = RoleSystem.Tag)]
        public ActionResult CreateCms()
        {
            try
            {
                return View();
            }
            catch (Exception ex)
            {
                return View();
            }
        }
        #endregion

        #region POST: /Tag/CreateCms
        [RoleHelper(Roles = RoleSystem.Tag)]
        [HttpPost]
        public ActionResult CreateCms(Tag tag)
        {
            try
            {
                UpdateModel(tag);
                var t = new Tag();
                t.CreateBy = UserManager.GetUserId();
                t.CreatedDate = DateTime.Now;
                t.Name = tag.Name;
                var exitTag = eDataContext.Tags.Where(e => e.Name.ToLower() == t.Name.Trim().ToLower()).Count();
                if ( exitTag > 0)
                {
                    Messages.ClearAllMessage();
                    Messages.AddErrorFlashMessage("Tag này đã tồn tại trong cơ sở dữ liệu. Bạn vui lòng thêm tag khác!");
                    return View();
                }
                else
                {
                    eDataContext.Tags.InsertOnSubmit(t);
                    eDataContext.SubmitChanges();
                    Messages.ClearAllMessage();
                    Messages.AddFlashMessage("Thêm tag mới thành công");
                    return RedirectToAction("IndexCms");
                }
            }
            catch (Exception ex)
            {
                Messages.ClearAllMessage();
                Messages.AddErrorFlashMessage("Thêm tag mới không thành công. Vui lòng thử lại với dữ liệu khác");
                return View();
            }
        }
        #endregion

        #region GET: /Tag/EditCms
        [RoleHelper(Roles = RoleSystem.Tag)]
        public ActionResult EditCms(int id)
        {
            try
            {
                var currentTag = eDataContext.Tags.Where(e => e.ID == id).SingleOrDefault();
                return View(currentTag);
            }
            catch (Exception ex)
            {
                ViewData["MessageInfo"] = "Không tìm thấy tag hiện tại. Vui lòng thử lại với dữ liệu khác";
                return View();
            }
        }
        #endregion

        #region POST: /Tag/EditCms
        [RoleHelper(Roles = RoleSystem.Tag)]
        [HttpPost]
        public ActionResult EditCms(int id, Tag tag)
        {
            try
            {
                if (id < 0) throw new NotSupportedException();
                
                var currentTag = eDataContext.Tags.Where(e => e.ID == id).SingleOrDefault();
                UpdateModel(currentTag);
                eDataContext.SubmitChanges();
                Messages.AddFlashMessage("Sửa tag thành công");
                return RedirectToAction("IndexCms");
            }
            catch (Exception ex)
            {
                Messages.AddFlashMessage("Sửa tag không thành công");
                return View();
            }
        }
        #endregion

        #region GET: /Tag/Delete
        [RoleHelper(Roles = RoleSystem.Tag)]
        public ActionResult Delete(int id)
        {
            try
            {
                
                var currentTag = eDataContext.Tags.Where(e => e.ID == id).SingleOrDefault();
                return View(currentTag);
            }
            catch (Exception ex)
            {
                ViewData["MessageInfo"] = "Có lỗi xảy ra bạn không thể xóa được";
                return View();
            }
        }
        #endregion

        #region POST: /Tag/Delete
        [RoleHelper(Roles = RoleSystem.Tag)]
        [HttpPost]
        public ActionResult DeleteCms(int id, FormCollection frm)
        {
            try
            {
                var currentTag = eDataContext.Tags.Where(ca => ca.ID == id).SingleOrDefault();
                eDataContext.Tags.DeleteOnSubmit(currentTag);
                eDataContext.SubmitChanges();
                return RedirectToAction("IndexCms");
            }
            catch (Exception ex)
            {
                ViewData["MessageInfo"] = "Có lỗi xảy ra bạn không thể xóa được";
                return View();
            }

        }
        #endregion

        #region GET: /Tag/Detail
        [RoleHelper(Roles = RoleSystem.Tag)]
        public ActionResult DetailCms(int id)
        {
            try
            {
                var currentTag = eDataContext.Tags.Where(ca => ca.ID == id).SingleOrDefault();

                return View(currentTag);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #endregion
    }
}
